/*
 * Класс комментария. Имеет два представления: режим просмотра и режим редактирования.
 * 
 * Во втором режиме загружается форма редактирования комментария в нее сам текст комментария и инициализируется
 * tinymce. Затем по кнопкам все это скрывается.
 * 
 * Также умеет для себя создавать объект субмиттера на случай если на этот комментарий захочется ответить.
 * 
 * Примечательно то, что субмиттер управляется из объекта комментария. Те он не закрывает сам себя. Так уж получилось, 
 * что наш интерфейсный дизайнер нарисовал так что сабмиттер закрывался всегда чем-то извне.
 * 
 * @author Alexander Sibiryakov
 */
function Comment(ccontainer_object, dom_element) {
	this._view = new CommentView(dom_element);
	this.ccontainer = ccontainer_object;
	this.submitter = null; // по умолчанию сабмиттера нету	
	this.oid = this._view.getOid();
	this.edit_mode = 0;	
	
	/*
	 * Выводит сабмиттер, и вешает обработчик на кнопку "Закрыть"
	 */
	this.showSubmitter = function() {
		if (this.submitter == null) {
			this.submitter = new CommentSubmit(this);
			this.submitter.setCContainer(this.ccontainer);
		}
		this.submitter.setItemOid(this.ccontainer.item_oid);
		this.submitter.setParentOid(this.oid);
		
		this._view.changeToAnswerOpenedState();
		
		// вешает обработчик на кнопку закрыть
		jQuery(this._view.getAnswCloseBtn()).one("click", this, function(e) {
			e.preventDefault();
			var _this = e.data;
			_this.onAnswerEnd();
		});
		
		this.submitter.show();
	}
	
	/*
	 * Этот метод вызывается CommentSubmitter при возникновении какого-то события
	 */
	this.onAnswerEnd = function() {
		this.submitter.remove();
		this._view.changeToAnswerClosedState();
	}
	
	/*
	 * Вернет элемент после которого вставлять новый коммент.
	 * Используется сабмиттером, чтобы узнать куда добавлять новый комментарий.
	 * 
	 */
	this.getNewCommentPrevElt = function() {
		return this._view.getSelf();
	}
	
	/*
	 * Переключиться на режим редактирования, может инициировать загрузку формы с текстарией.
	 */
	this.openEditMode = function(formhtml) {
		if (!formhtml) {
			this.loadForm();
			return;
		} else {
			var cbody = this._view.getCommentBody();

			this._view.initEditState(formhtml);
			this._view.setCommentContent(cbody);
			this._bindButtonsEvents();
			this._view.tinyMceOn();
			
			this.edit_mode = 1;
		}
	}
	
	/*
	 * Загрузка формы редактирования
	 */
	this.loadForm = function() {
		cp.set_env_object(this);
		cp.call(get__Url('/ajax'), 'ajax_getUpdateForm', function(result) {
			this.openEditMode( result.ajaxResponse[0].data );
		}, this.oid);
	}
	
	this.getSelf = function() {
		return this._view.getSelf();
	}
	
	/*
	 * callback - закрывает режим редактирования и перезагружает коммент
	 */
	this.closeEditMode = function(type) {
		switch (type) {
			case 1: // сохарнить изменения
				this.saveComment();
			break;
			
			default: // выйти без сохранения изменений
				this.reload();
			break;
		}
		this.edit_mode = 0;
	}
	
	/*
	 * Загружает комментарий с сервера и заменяет контейнер. Переходит в режим просмотра.
	 */
	this.reload = function() {
		cp.set_env_object(this);
		cp.call(get__Url('/ajax'), 'ajax_getComment', function(result) {
			
			this._view.tinyMceOff();
			
			// замена
			this._view.initViewState( result.ajaxResponse[0].html[0].data );
			this._bindEvents();
		}, this.oid);
		
	}
	
	/*
	 * Сохраняет комментарий и перезагружает его контейнер
	 */
	this.saveComment = function() {
		cp.set_env_object(this);
		cp.call(get__Url('/ajax'), 'ajax_upCommentBody', function(result) {
			if (result.ajaxResponse[0].data > 0) {
			// нормальное завершение
			
			this.reload();
			} else { alert('Статус ошибки '+result.ajaxResponse[0].data); }

		}, this.oid, this._view.getCommentContent());
	}
	
	/*
	 * Удаляет комментарий, и перезагружает его контейнер
	 */
	this.delComment = function() {
		
		if (confirm('Вы действительно хотите удалить этот комментарий?')) {
			cp.set_env_object(this);
			cp.call(get__Url('/ajax'), 'ajax_delComment', function(result) {
				this.delComment_callback(result);
			}, this.oid);
			
		} else return;
	}
	
	this.delComment_callback = function(result) {
		
		if (result.ajaxResponse[0].data > 0) {
			this.reload();
		} else { window.console.log('there is an error code '+result.ajaxResponse[0].data); }
		
	}
	
	/*
	 * Вешает обработчики к режиме редактирования
	 */	
	this._bindButtonsEvents = function() {
		jQuery(this._view.getUpSubmitBtn()).bind("click", this, function(event) {
			event.preventDefault();
			event.data.closeEditMode(1);
		});
		jQuery(this._view.getUpCancelBtn()).bind("click", this, function(event) {
			event.preventDefault();
			event.data.closeEditMode(false);
		});
	}
	
	/*
	 * Вешает обработчики на кнопки в режиме просмотра
	 */
	this._bindEvents = function() {		
		// кнопка "Ответить"
		jQuery(this._view.getAnswerElt()).bind("click", this, function(event) {
			event.preventDefault();
			event.data.showSubmitter();
		});
		
		// кнопка "Редактировать"
		jQuery(this._view.getEditElt()).bind("click", this, function(event) {
			event.preventDefault();
			event.data.openEditMode();
		});
		
		// кнопка "Удалить"
		jQuery(this._view.getDelElt()).bind("click", this, function(event) {
			event.preventDefault();
			event.data.delComment();
		});
	}
	this._bindEvents();
	
}
